package com.gxa.javaserver.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.gxa.javaserver.dao.AdminMapper;
import com.gxa.javaserver.dto.Response;
import com.gxa.javaserver.dto.ResultDO;
import com.gxa.javaserver.exception.DataException;
import com.gxa.javaserver.exception.LoginException;
import com.gxa.javaserver.groups.Add;
import com.gxa.javaserver.groups.Login;
import com.gxa.javaserver.pojo.Admin;
import com.gxa.javaserver.pojo.AdminVo;
import com.gxa.javaserver.service.AdminService;
import com.gxa.javaserver.utils.DataValidator;
import com.gxa.javaserver.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpSession;
import java.sql.Timestamp;
import java.util.List;

/**
 * @author:Teacher黄
 * @date:Created at 2020/06/04
 */
@Service
@SuppressWarnings("all")
public class AdminServiceImpl implements AdminService {

    @Autowired
    private AdminMapper adminMapper;

    @Autowired
    private DataValidator dataValidator;


    /**
     * 登陆的实现
     * @param admin : 管理员对象
     * @param session : session对象
     * @return
     */
    @Override
    public ResultDO login(Admin admin, HttpSession session) throws LoginException {
        // 数据验证
        // 如果不进行数据验证, admin对象中的数据很可能是null
        // 如果为null
        dataValidator.validate(admin, Login.class);


        // 1. 先通过名字去查询数据
        Admin dbAdmin = adminMapper.findByName(admin.getAdminName());
        // 2. 判断该用户是否存在?
        if (dbAdmin == null) {
            throw new LoginException(1001,"用户不存在!");
        }
        // 3. 判断用户的密码是否正确?
        if (!dbAdmin.getAdminPwd().equals(MD5Util.MD55(admin.getAdminPwd()))) {
            throw new LoginException(1002,"密码不正确!");
        }
        // 登陆成功=> 将数据存储在session中
        session.setAttribute("admin",dbAdmin);
        // 修改登陆时间
        dbAdmin.setLastLoginTime(new Timestamp(System.currentTimeMillis()));
        adminMapper.update(dbAdmin);

        return Response.success("登陆成功!");
    }

    /**
     * 管理员列表
     * @param adminVo : 管理员包装类对象
     * @return
     */
    @Override
    public ResultDO list(AdminVo adminVo) {
        // 进行分页
        PageHelper.startPage(adminVo.getPage(),adminVo.getPageSize());

        // 条件处理
        if(!StringUtils.isEmpty(adminVo.getKeywords())){
            adminVo.setKeywords("%"+adminVo.getKeywords()+"%");
        }

        // 先查询数据库
        List<Admin> list = adminMapper.search(adminVo);

        // 进行pageInfo的包装
        PageInfo<Admin> pageInfo = new PageInfo<>(list);

        return Response.success("获取数据成功!",pageInfo);
    }


    /**
     * 添加管理员
     * @param admin : 管理的对象
     * @return
     */
    @Override
    public ResultDO add(Admin admin) {
        // 数据校验
        dataValidator.validate(admin, Add.class);

        // 去查询数据库,看当前用户是否存在
        Admin dbAdmin = adminMapper.findByName(admin.getAdminName());
        if (dbAdmin != null) {
            // 说明用户已经存在
            throw new DataException(3002,"该用户已经存在!");
        }

        // 初始化创建时间
        admin.setCreateTime(new Timestamp(System.currentTimeMillis()));
        // 处理密码
        admin.setAdminPwd(MD5Util.MD55(admin.getAdminPwd()));

        adminMapper.save(admin);

        return Response.success("添加管理员成功!");
    }

    /**
     * 删除
     * @param ids
     * @return
     */
    @Override
    public ResultDO delete(String[] ids) {
        adminMapper.deleteAllByPk(ids);
        return Response.success("删除成功!");
    }
}
